package com.ruoyi.lyy.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.lyy.domain.pojo.Merchant;
import com.ruoyi.lyy.domain.vo.MerchantVO;
import com.ruoyi.lyy.domain.vo.PageQueryVO;
import com.ruoyi.lyy.mapper.MerchantMapper;
import com.ruoyi.lyy.service.IMerchantService;
import com.ruoyi.lyy.service.IServiceDetailsService;

import com.ruoyi.lyy.utils.CoordinateUtils;
import lombok.RequiredArgsConstructor;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * <p>
 * 商户表 服务实现类
 * </p>
 *
 * @author YueYang
 * @since 2025-11-12
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> implements IMerchantService {

    private final IServiceDetailsService serviceDetailsService;

    private final MerchantMapper merchantMapper;

    /**
     * 分页查询商户
     *
     * @param longitude 经度
     * @param latitude  纬度
     * @param pageNum   页码
     * @param pageSize  每页数量
     * @return 商户列表
     */
    @Override
    public PageQueryVO<MerchantVO> pageMerchant(Double longitude, Double latitude, Integer pageNum, Integer pageSize) {
        //1. 查询洗车服务的所有商户id
        List<Integer> merchantIds = serviceDetailsService.getMerchantIdsByTypeId(1);

        //2. 根据商户id集合分页查询商户信息
        //2.1.使用分页插件进行查询 开启分页插件
        PageHelper.startPage(pageNum, pageSize);

        //2.2. 查询所有符合条件的洗车店商户信息
        List<Merchant> merchantAllList = merchantMapper.pageQueryMerchantByIds(merchantIds);

        //2.3 装配到PageInfo中
        PageInfo<Merchant> pageInfo = new PageInfo<>(merchantAllList);
        List<Merchant> merchantList = pageInfo.getList();

        //3. 遍历商户列表 封装vo对象
        List<MerchantVO> merchantVOList = new ArrayList<>();
        for (Merchant merchant : merchantList) {
            MerchantVO merchantVO = new MerchantVO();
            //3.1 封装普通对象
            merchantVO.setId(merchant.getId());
            merchantVO.setAddress(merchant.getAddress());
            merchantVO.setName(merchant.getName());
            //销量随机生成 还得查订单表 又没有数据
            merchantVO.setSales(new Random().nextInt(1000));
            merchantVO.setRate(merchant.getRate());
            //3.2 封装营业时间 这个是 09:00-18:00 格式
            //空值判断
            if (merchant.getStartTime() == null || merchant.getEndTime() == null) {
                //时间为空值
                log.warn("商户id为{}的营业时间为空值", merchant.getId());
                merchantVO.setBusinessTime("每日营业时间未定~");

            } else {
                //营业时间不为空值 正常处理
                //截取时间字符串前5位 不保留秒
                String startTime = merchant.getStartTime().toString().substring(0, 5);
                String endTime = merchant.getEndTime().toString().substring(0, 5);
                merchantVO.setBusinessTime(startTime + "-" + endTime);
            }


            //3.3 封装距离
            //空值判断
            if (merchant.getLatitude() == null || merchant.getLongitude() == null) {
                //经纬度为空值
                log.warn("商户id为{}的经纬度为空值", merchant.getId());
                merchantVO.setDistance("距离未知~");
            } else {
                //经纬度不为空值 正常处理
                //调用工具类计算距离 拿出来的值是千米
                double distance = CoordinateUtils.distance(latitude, longitude, Double.parseDouble(merchant.getLatitude()), Double.parseDouble(merchant.getLongitude()));
                if (distance < 1) {
                    //如果距离值 小于1，使用米来计算, 不保留小数部分 对小数*1000后四舍五入
                    distance = Math.round(distance * 1000.0);
                    merchantVO.setDistance(distance + "m");
                } else {
                    //以千米为单位 保留两位小数 比如 3.14； round()*100后变成 314.0 再除以100.0 变成 3.14
                    distance = Math.round(distance * 100.0) / 100.0;
                    merchantVO.setDistance(distance + "km");
                }
            }

            //3.4 查询商户图片表获取该商户的图片信息
            List<String> imgs = merchantMapper.queryMerchantImgsByMid(merchant.getId());
            merchantVO.setImgs(imgs);


            //3.5 封装到vo列表
            merchantVOList.add(merchantVO);
        }
        //4. 返回vo列表
        PageQueryVO<MerchantVO> merchantVOPageInfo = new PageQueryVO<>();
        merchantVOPageInfo.setList(merchantVOList);
        merchantVOPageInfo.setTotal(pageInfo.getTotal());
        merchantVOPageInfo.setPageNum(pageInfo.getPageNum());
        merchantVOPageInfo.setPages(pageInfo.getPages());
        return merchantVOPageInfo;
    }


}
